package cn.bidlink.procurement.survey.demand.dal.service;

import cn.bidlink.base.ServiceResult;
import cn.bidlink.base.util.PageSet;
import cn.bidlink.procurement.survey.demand.dal.entity.BaseEntity;

import java.util.List;

public interface BaseService<T extends BaseEntity> {
    int DEFAULT_BATCH_SIZE = 1000;

    /**
     * 新增条目
     *
     * @param entity 带有新增数据的对象
     * @return 返回新增条目数据库影响数
     * @author :<a href="mailto:yuzhewang@ebnew.com">wangyuzhe</a>
     * @date :2020-10-30
     */
    ServiceResult<Long> save(T entity);

    /**
     * 选择插入
     * @param entity
     * @return
     */
    ServiceResult<Long> insertSelective(T entity);

    /**
     * 更新条目
     *
     * @param entity 带有更新数据的对象
     * @return 返回更新条目数据库影响数
     * @author :<a href="mailto:yuzhewang@ebnew.com">wangyuzhe</a>
     * @date :2020-10-30
     */
    ServiceResult<Integer> update(T entity);


    /**
     * 批量更新
     * @param entityList
     * @return
     */
    ServiceResult<Integer> updateBatch(List<T> entityList);

    /**
     * 根据主键-物理删除
     *
     * @param id  主键id
     * @return 返回删除条目数据库影响数
     * @author :<a href="mailto:yuzhewang@ebnew.com">wangyuzhe</a>
     * @date :2020-10-30
     */
    ServiceResult<Integer> delete(Long id);

    /**
     * 根据IDS删除对应条目
     * @param ids ids
     * @return 返回删除条目数据库影响数
     */
    ServiceResult<Integer> deleteBatch(List<Long> ids);

    /**
     * 根据条件删除
     * @param entity
     * @return
     */
    ServiceResult<Integer> deleteByCondition(T entity);

    /**
     * 根据ID查询对应的条目
     *
     * @param id  主键id
     * @return 返回查询的结果
     * @author :<a href="mailto:yuzhewang@ebnew.com">wangyuzhe</a>
     * @date :2020-10-30
     */
    ServiceResult<T> findByPK(Long id);

    /**
     * 根据条件查询对应的条目总数
     *
     * @param entity 带有查询条件的对象
     * @return 返回查询的结果总数
     * @author :<a href="mailto:yuzhewang@ebnew.com">wangyuzhe</a>
     * @date :2020-10-30
     */
    ServiceResult<Long> getTotalCount(T entity);

    /**
     * 根据条件查询对应的条目
     *
     * @param entity 带有查询条件的对象
     * @param pageSet         分页对象
     * @return 返回查询的结果集合
     * @author :<a href="mailto:yuzhewang@ebnew.com">wangyuzhe</a>
     * @date :2020-10-30
     */
    <E extends PageSet> ServiceResult<List<T>> findByCondition(T entity, E pageSet);

    /**
     * 根据条件查询对应的条目
     *
     * @param entity 带有查询条件的对象
     * @return 返回查询的结果集合
     * @author :<a href="mailto:yuzhewang@ebnew.com">wangyuzhe</a>
     * @date :2020-10-30
     */
    ServiceResult<List<T>> findByCondition(T entity);

    /**
     * 根据主键集合查询结合
     *
     * @param ids 主键集合
     * @return 返回查询的结果集合
     * @author :<a href="mailto:yuzhewang@ebnew.com">wangyuzhe</a>
     * @date :2020-10-30
     */
    ServiceResult<List<T>> findByIds(List<Long> ids);

    /**
     * 批量插入
     *
     * @param entityList 需要批量出入的对象集合
     * @return 返回数据库的影响条数 service result
     * @author :<a href="mailto:yuzhewang@ebnew.com">wangyuzhe</a>
     * @date :2020-10-30
     */
    ServiceResult<Integer> insertBatch(List<T> entityList);

    /**
     * 批量选择插入(只适用予所有插入元素结构一致，比如某个元素都不为空，某个元素都为空)
     * @param entity
     * @return
     */
    ServiceResult<Integer> insertSelectiveBatch(List<T> entity);


    BaseDao<T> getBaseDao();
}
